I øvelsen fik vi næsten hele den kode som vi skulle bruge for at kunne implementere, vi skulle dog selv skrive read delen for koden
ssize_t mygpio_read(struct file *filep, char __user *buf,
size_t count, loff_t *f_pos)
{
char readBuf[MAXLEN];
int len, result=-1, minor;
int g_value;
/*
* retrieve minor from file ptr
*/
minor = MINOR(filep->f_dentry->d_inode->i_rdev);
printk(KERN_ALERT "Reading from MyGpio [Minor] %i \n", minor);
/*
* Read GPIO port
* (if an input port)
*/
/*** YOUR CODE HERE ****/
if(gpio[minor].dir==in)
g_value = gpio_get_value(gpio[minor].num);
/*
* Convert int to string
* using sprintf
*/
len=sprintf(readBuf,"%i", result);
len++; // To include null-termination
printk(KERN_ALERT "testBuf: %s \n", readBuf);
/*
* Copy string result
* to User Space
*/
if(copy_to_user(buf, readBuf, len))
return -EFAULT;
*f_pos += len;
return len;
}
Read delen skal kunne gå ind og læser Major. Vi har gjort den dynamisk sådan at den kan skifte imellem de muligheder der er defineret i starten af koden.
Compiler vi koden og indsætter på target. Til indsættelse i kernen benyttes kommandoen insmod.
Insert:
Efter at have indsat i kernen skal vi oprette en nod. Nod'en skal oprettes med Major nummer 62, da det er det nummer vi har givet den. Herefter kan den selv finde rundt i resten.
create a node with major number 62:
root@beagleboard:/tmp# mknod /dev/gpio0 c 62 0
Efter oprettelse af nod checker vi at den er blevet oprettet:
Test for at den har fået nummer 62
root@beagleboard:/tmp# ls -l /dev/gp*
crw-r--r-- 1 root root 62, 0 Jan 1 00:15 /dev/gpio0
Som afslutning på opgaven ønsker vi at skrive til hvores driver. Dette gør vi med echo hvor vi skriver 1 til den:
Tester at vi kan skrive til den
root@beagleboard:/tmp# echo 1 > /dev/gpio0
2000 Jan 1 00:16:14 beagleboard [ 977.849365] Writing to MyGpio [Minor] 0
Opnået i opgaven
I opgaven har vi arbejdet med en driver der kan aktivere forskellige GPIO'er. Denne driver har vi indsat i kernen og oprettet en Nod som er kommunikationen ned til driveren, altså den der binder hardware og driveren sammen. Når vi har set at forbindelsen er blevet oprettet tester vi ved at skrive til driveren.
root@beagleboard:/tmp# echo 1 > /dev/gpio
2000 Jan 1 00:31:43 beagleboard [ 1907.472930] Writing to MyGpio [Minor] 0
root@beagleboard:/tmp# dmesg
ssize_t mygpio_read(struct file *filep, char __user *buf, size_t count, loff_t *f_pos) { char readBuf[MAXLEN]; int len, result=-1, minor; int g_value; /* * retrieve minor from file ptr */ minor = MINOR(filep->f_dentry->d_inode->i_rdev); printk(KERN_ALERT "Reading from MyGpio [Minor] %i \n", minor); /* * Read GPIO port * (if an input port) */ /*** YOUR CODE HERE ****/ if(gpio[minor].dir==in) g_value = gpio_get_value(gpio[minor].num); /* * Convert int to string * using sprintf */ len=sprintf(readBuf,"%i", result); len++; // To include null-termination printk(KERN_ALERT "testBuf: %s \n", readBuf); /* * Copy string result * to User Space */ if(copy_to_user(buf, readBuf, len)) return -EFAULT; *f_pos += len; return len; }Read delen skal kunne gå ind og læser Major. Vi har gjort den dynamisk sådan at den kan skifte imellem de muligheder der er defineret i starten af koden.Compiler vi koden og indsætter på target. Til indsættelse i kernen benyttes kommandoen insmod.
Insert:
Efter at have indsat i kernen skal vi oprette en nod. Nod'en skal oprettes med Major nummer 62, da det er det nummer vi har givet den. Herefter kan den selv finde rundt i resten.
create a node with major number 62:
Efter oprettelse af nod checker vi at den er blevet oprettet:
Test for at den har fået nummer 62
Som afslutning på opgaven ønsker vi at skrive til hvores driver. Dette gør vi med echo hvor vi skriver 1 til den:
Tester at vi kan skrive til den
Opnået i opgaven
I opgaven har vi arbejdet med en driver der kan aktivere forskellige GPIO'er. Denne driver har vi indsat i kernen og oprettet en Nod som er kommunikationen ned til driveren, altså den der binder hardware og driveren sammen. Når vi har set at forbindelsen er blevet oprettet tester vi ved at skrive til driveren.
Se